#ifndef CFlag_h
#define CFlag_h



class CFlag
{
    typedef unsigned int Flag32_t;
public:
    CFlag(Flag32_t startFlag=0):myFlags(startFlag){}
    ~CFlag(){}
public:
         void Clear()                         { myFlags = 0;                    }
  Flag32_t GetFlags()const                    { return myFlags;                 }
       void SetFlag(const Flag32_t flag)      { myFlags |= flag;                }
     void UnSetFlag(const Flag32_t flag)      { myFlags &= (~flag);             }
        void Select(const Flag32_t flag)      {  Clear(); SetFlag(flag);        }
        bool IsFlag(const Flag32_t flag)const { return (flag & myFlags)== flag; }

     CFlag& operator<<(const Flag32_t flag) { SetFlag(flag); return *this;   }
     CFlag& operator>>(const Flag32_t flag) { UnSetFlag(flag); return *this; }

     bool operator==(const Flag32_t flag) { return IsFlag(flag);        }
     bool operator!=(const Flag32_t flag) { return IsFlag(flag)==false; }


// #define F(a) const Flag32_t flag##a
// #define FL(a) (myFlags &flag##a)!=0
// 
//      bool IsFlag(F(0) )const { return FL(0); }
//      bool IsFlag(F(1),F(2) )const { return FL(1)&&FL(2); }
//      bool IsFlag(F(1),F(2),F(3) )const { return FL(1)&&FL(2)&&FL(3); }
//      bool IsFlag(F(1),F(2),F(3),F(4) )const { return FL(1)&&FL(2)&&FL(3)&&FL(4); }
//      bool IsFlag(F(1),F(2),F(3),F(4),F(5) )const { return FL(1)&&FL(2)&&FL(3)&&FL(4)&&FL(5); }
//      bool IsFlag(F(1),F(2),F(3),F(4),F(5),F(6) )const { return FL(1)&&FL(2)&&FL(3)&&FL(4)&&FL(5)&&FL(6); }
//      bool IsFlag(F(1),F(2),F(3),F(4),F(5),F(6),F(7) )const { return FL(1)&&FL(2)&&FL(3)&&FL(4)&&FL(5)&&FL(6)&&FL(7); }
// 
// #undef F
// #undef FL
     

private:
    Flag32_t myFlags;
};

// CFlag fl; fl.SetFlag(eVISIBLE_ACTIONS/*|eCopy_CTIO*/);
// 
// cout << fl.IsFlag(eVISIBLE_ACTIONS)<<endl;
// cout << fl.IsFlag(eCopy_CTIO)<<endl;
// cout << fl.IsFlag(eVISIBLE_ACTIONS&eCopy_CTIO)<<endl;
// cout << fl.IsFlag(eCopy_CTIO&eVISIBLE_ACTIONS)<<endl;


//     enum eState
//     {
//         eSTATE0 = (1<<0),   eSTATE1 = (1<<1),   eSTATE2 = (1<<2),   eSTATE3 = (1<<3),   eSTATE4 = (1<<4),
//         eSTATE5 = (1<<5),   eSTATE6 = (1<<6),   eSTATE7 = (1<<7),   eSTATE8 = (1<<8),   eSTATE9 = (1<<9),
//         eSTATE10 = (1<<10), eSTATE11 = (1<<11), eSTATE12 = (1<<12), eSTATE13 = (1<<13), eSTATE14 = (1<<14),
//         eSTATE15 = (1<<15), eSTATE16 = (1<<16), eSTATE17 = (1<<17), eSTATE18 = (1<<18), eSTATE19 = (1<<19),
//         eSTATE20 = (1<<20), eSTATE21 = (1<<21), eSTATE22 = (1<<22), eSTATE23 = (1<<23), eSTATE24 = (1<<24),
//         eSTATE25 = (1<<25), eSTATE26 = (1<<26), eSTATE27 = (1<<27), eSTATE28 = (1<<28), eSTATE29 = (1<<29),
//         eSTATE30 = (1<<30), eSTATE31 = (1<<31),
//     };

#endif